home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / objects in c ƒ / OIC Sources / IndexMixin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-05  |  2.4 KB  |  120 lines  |  [TEXT/KAHL]

  1. /*    
  2.  *        IndexMixin abstract class
  3.  *
  4.  *        a general class mixin which maintains a sequenceable list of
  5.  *        all the class's instances. 
  6.  *
  7.  *            Copyright © John Wainwright 1988
  8.  *
  9.  *    MetaClass :
  10.  *
  11.  *    SuperClasses :
  12.  *
  13.  *    Class Vars :
  14.  *    
  15.  *        instanceList    - head of the instance list
  16.  *
  17.  *    Methods :
  18.  *
  19.  *        new                - new demon to build the instance list
  20.  *
  21.  *    Class Methods :
  22.  *
  23.  *        sequence obj    - returns an sequence object for the instance list
  24.  *        allInstances    - returns a List of all the instances
  25.  *        deepInstances    - returns a List of all specialised instances
  26.  */
  27.  
  28. #include "oic.h"
  29. #include "generics.h"
  30.  
  31. class       IndexMixin;            /* the IndexMixin class                 */
  32.  
  33. struct indexMixin_c                /* IndexMixin class var structure         */
  34. {
  35.     object    imc_head;            /* head of the instance list             */
  36.     int        imc_count;            /* how many in list                        */
  37. };
  38. typedef struct indexMixin_c indexMixin_c;
  39.  
  40. struct indexMixin_i                /* IndexMixin instance structure         */
  41. {
  42.     object    im_next;
  43. };
  44. typedef struct indexMixin_i indexMixin_i;
  45.  
  46. /* -------------------- IndexMixin Instance methods ---------------------------- */
  47.  
  48. method object
  49. _new(self, im, argp)
  50.     object                    self;
  51.     register indexMixin_i    *im;
  52.     object                    *argp;
  53. {
  54.     register indexMixin_c    *imc;
  55.     
  56.     imc = localCVs(self, indexMixin_c);
  57.     im->im_next = imc->imc_head;
  58.     imc->imc_head = self;
  59.     imc->imc_count += 1;
  60.  
  61.     return self;
  62. }
  63.  
  64. /* -------------------- IndexMixin Class methods ---------------------------- */
  65.  
  66. method object
  67. _sequence(class, cv)
  68.     class              class;
  69.     indexMixin_c    *cv;
  70. {
  71.     return start(New(Linkseq), allInstances(class));
  72. }
  73.  
  74. method object
  75. _allInstances(cl, cv)
  76.     class              cl;
  77.     indexMixin_c    *cv;
  78. {
  79.     register object    list;
  80.     register object    c;
  81.     
  82.     list = New(List, END);
  83.     for (c = cv->imc_head; c != END; c = localIVs(c, indexMixin_i)->im_next)
  84.         push(list, c);
  85.         
  86.     return list;
  87. }
  88.  
  89. method object
  90. _deepInstances(class)
  91.     class              class;
  92. {
  93.     register object    list;
  94.     register object    seq;
  95.     register object    c;
  96.     
  97.     list = allInstances(class);
  98.     for (seq = sequence(subs(class)); c = next(seq); )
  99.         join(list, allInstances(c));
  100.     return list;
  101. }
  102.  
  103. /* ------------------- Init the IndexMixin class ------------------------------- */
  104.  
  105. InitIndexMixin()
  106. {
  107.     IndexMixin = NewClass(sizeof(indexMixin_i), sizeof(indexMixin_c),
  108.                           "IndexMixin", END);
  109.     AddMethods(IndexMixin,
  110.         newGeneric,             _new,
  111.         END);
  112.         
  113.     AddClassMethods(IndexMixin,
  114.         allInstancesGeneric,     _allInstances,
  115.         deepInstancesGeneric,     _deepInstances,
  116.         sequenceGeneric,        _sequence,
  117.         END);
  118. }
  119.  
  120.